package com.example.steriousfx.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * JSON 工具
 *
 * @author gzkemays
 * @since 2021/10/20 20:36
 */
public class JsonUtils {

  /**
   * JSON 格式化
   *
   * @param txt 原文本
   * @return {@link String} 格式化结果
   */
  public static String jsonFormat(String txt) {
    if (isJson(txt)) {
      StringBuilder sb = new StringBuilder();
      int strLen = txt.length();
      int tab = 0;
      for (int i = 0; i < strLen; i++) {
        char str = txt.charAt(i);
        // 对象头部进行 \n 换行和行缩进 --> tab++
        if (str == '{') {
          tab++;
          sb.append(str).append("\n").append(getSpace(tab));
          // 对于对象底部进行先换行返回缩进
        } else if (str == '}') {
          tab--;
          sb.append("\n").append(getSpace(tab)).append(str);
          // 对于对象参数进行换行
        } else if (str == ',') {
          sb.append(str).append("\n").append(getSpace(tab));
        } else if (str == ':') {
          sb.append(str).append(" ");
        } else {
          sb.append(str);
        }
      }
      return sb.toString();
    }
    return null;
  }

  /**
   * 获取空格位置
   *
   * @param tab 空格次数
   * @return {@link String} 最终空白字符串
   */
  public static String getSpace(int tab) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < tab; i++) {
      sb.append("\t");
    }
    return sb.toString();
  }

  /**
   * 判断是否为 JSON
   *
   * @param txt 判断字符
   * @return 是否属于 JSON
   */
  public static boolean isJson(String txt) {
    boolean isJson = true;
    boolean isJsonArray = true;
    try {
      JSONObject.parse(txt);
    } catch (Exception e) {
      isJson = false;
    }
    try {
      JSONArray.parse(txt);
    } catch (Exception e) {
      isJsonArray = false;
    }
    return isJson || isJsonArray;
  }

  public static void main(String[] args) {
    String txt =
        jsonFormat(
            "{\"errno\":0,\"errmsg\":\"\",\"data\":{\"newUser\":0,\"oldUser\":0,\"addCart\":0,\"newData\":[],\"oldData\":[],\"addOrderNum\":1,\"addOrderSum\":0.01,\"payOrderNum\":1,\"payOrderSum\":0.01}}");
    System.out.println(txt);
  }
}
